package me.ezjs.framework.core.dao;

import me.ezjs.framework.core.model.DAOFilter;
import me.ezjs.framework.core.model.FlipFilter;

import java.io.Serializable;
import java.util.List;

/**
 * DAO操作基础接口
 * Created by zero-mac on 16/3/10.
 */
public interface GenericDAO<T, ID extends Serializable> {


    ///////////////////////////////////////////////////////////////////////////
    // 快捷键:sbc
    // 根据指定条件获取对象
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 根据主键获得实例.
     *
     * @param id
     * @return
     */
    T get(ID id);

    /**
     * 根据单一条件获得唯一对象.
     *
     * @param fieldName
     * @param val
     * @return
     */
    T get(String fieldName, Object val);

    /**
     * 根据过滤条件获得唯一对象,若无则为null.
     *
     * @param filter
     * @return
     */
    T get(DAOFilter filter);

    /**
     * 判断主键对应数据是否存在.
     *
     * @param id
     * @return
     */
    boolean exists(ID id);

    ///////////////////////////////////////////////////////////////////////////
    // 保存 or 更新
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 新增和更新对象,若主键为null则为新增,否则为更新.
     * <p/>
     * 重要:在Spring MVC封装时,若从页面传入id且为空(""), 则spring MVC会封装成"",需手动设为null,否则保存失败.
     *
     * @param object
     * @return
     */
    T save(T object);

    ///////////////////////////////////////////////////////////////////////////
    // 强制删除
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 删除指定的实例
     *
     * @param object
     */
    void remove(T object);

    /**
     * 删除指定ID的实例
     *
     * @param id
     */
    void remove(ID id);

    /**
     * 根据filter进行删除
     *
     * @param filter
     * @return
     */
    int remove(DAOFilter filter);

    ///////////////////////////////////////////////////////////////////////////
    // 批量获取
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 根据filter获得匹配总数
     *
     * @param filter
     * @return
     */
    long count(DAOFilter filter);

    /**
     * 根据查询条件查询
     */
    List<T> list(DAOFilter filter);

    /**
     * 分页查询,默认去除重复数据(distinct = true).
     */
    List<T> flipList(FlipFilter filter);

    /**
     * 分页查询
     *
     * @param filter
     * @param distinct
     * @return
     */
    List<T> flipList(FlipFilter filter, boolean distinct);

    /**
     * 获得所有数据,慎用.
     *
     * @return
     */
    List<T> getAll();

}
